#ifndef _62_NEW_CLASS_TEMPLATE_INSTANCE_HPP_
#define _62_NEW_CLASS_TEMPLATE_INSTANCE_HPP_

#include <iostream>
// 模板类的实例化方式
// 1.隐式实例化
// ArrayTP<int, 100> stuff;         // 隐式实例化
//
// ArrayTP<double, 100> *pt;        // 创建了一个指针,不会生成对应的类的实例
// pt = new ArrayTP<double, 100>;   // 现在创建了一个新对象

// 2. 显式实例化
// 当使用关键字 template并指出所需类型声明类时,编译器将生成类的显式实例化 (explicit instantiation)
// template class ArrayTP<double ,30>;
// 这里即使没有声明名称, 编译器也将生成类声明,也将根据通用模板生成具体化

// 3.显式具体化
// 显式具体化是给特定类型的定义, 有些时候,需要为特殊类型实例化时,对模板进行修改,使其行为不同

template <typename T>
class SortArray
{
    // ... details
};
// 具体化类模板的具体定义:
// template <> class ClassName<specialized-type-name> {/* ...  */};

//
// 如果需要专门提供一个给char *类型使用的SortArray类模板
template <typename T>
class SortArray
{
};

// 这样就可以使用显式具体化
template <>
class SortArray<const char *>
{
    // ... // 具体实现对于char指针使用strcmp()函数,而不是使用<符号,(因为指针比较大小实际上没有意义),就不会比较char字符串的地址
};

// 4. 部分具体化
// 部分具体化可以给类型参数之一制定具体的类型
// 总体模板
template <class T1, class T2>
class Pair
{
    // ...
};
// 具体化T2为int类型
template <class T1>
class Pair<T1, int>
{
};






#endif // _62_NEW_CLASS_TEMPLATE_INSTANCE_HPP_
